package kr.hkit.powerjava.algorithm;

public class Queue implements Structure {

	private int rear = -1;//제일 나중에 들어온 데이터의 위치
	private int front = -1;//제일 마지막에 삭제된 데이터의 위치
	private int size = 5;//큐의 size(생성자에서 지정하지 않는다면 기본 5)
	private String[] arrQueue;

	public Queue(int size) {
		this.size = size;
		arrQueue = new String[size];
	}

	@Override
	public void push(String item) {
		if(isFull()){//큐가 가득찼음을 의미(더이상 데이터를 받을 수 없음)
			System.out.println("Queue is Full");
		}else{//추가 가능한 상태
			arrQueue[++rear] = item;
			//제일 나중에 들어온 데이터의 위치를 rear이 알려주고 있으므로 새로운 것을 넣기위해서는
			//rear을 먼저 증가시킨 후에 연산을 하여야 하므로 ++rear
		}
	}

	@Override
	public void pop() {
		if(isEmpty()){//배열이 비었음을 의미(삭제할 데이터가 없음)
			System.out.println("Queue is Empty");
		}else{
			System.out.println(arrQueue[++front] + "을 삭제합니다.");
			//스택과는 다르게 앞에서부터 차례로 삭제해주므로 (인덱스 0, 1, 2, 순서대로)
			//삽입에서 rear를 증가해주듯이 삭제에서 front를 증가
			//실제로 삭제된 것은 아니지만 top이 데이터의 포인터이므로 쓰레기값으로 간주한다
		}
	}

	@Override
	public boolean isEmpty() {
		return rear == front;//rear가 마지막 삽입이고 front가 마지막 삭제이므로
		//두개가 같다는 것은 더이상 데이터가 없음을 의미
	}

	@Override
	public boolean isFull() {
		return rear >= size-1;//size-1이 마지막 인덱스 이므로 같다고 해도 되지만
		//혹시나 모를 오류를 줄이기 위해서 크거나 같다고 설정
		
	}

	@Override
	public void prnArr() {
		System.out.print("{ ");
		int i = front >= 0? (front + 1) : 0;
		
		for (; i <= rear; i++) {
			System.out.print(arrQueue[i] + " ");
		}
		System.out.println("}");
	}

}
